'''
python 中元类是什么？有什么作用？如何使用？

1. 元类是什么？
元类是类的类，用于控制类的创建行为（就像类控制实例的创建一样）。
type 是 Python 的内建元类，所有类默认由 type 创建。
自定义元类可以修改类的生成过程（如属性检查、方法注入等）。

2. 元类的作用
动态修改类：在类创建时自动添加/修改属性或方法。
强制约束：确保子类符合特定结构（如接口检查）。
ORM/框架：例如 Django 的模型类、SQLAlchemy 的 declarative_base 使用元类。

3. 基本使用方式
'''

# 元类可以修改类的属性
class Meta(type):
    '''
        cls: 元类自身
        name: 要创建的类的名称
        bases: 要创建的类的父类元组
        attrs: 要创建的类的属性字典，包括：方法，属性，类属性
    '''
    def __new__(cls, name, bases, attrs):

        # 在类创建前修改属性
        attrs['version'] = 1.0

        print("元类自身:", cls)  # 输出: <class '__main__.Meta'>
        print("类名:", name)  # 输出: MyClass
        print("父类:", bases)  # 输出: ()
        print("属性字典:", attrs)  # 输出:  {'__module__': '__main__', '__qualname__': 'MyClass', 'x': 43, 'version': 1.0}
        return super().__new__(cls, name, bases, attrs)


# 使用元类创建类
class MyClass(metaclass=Meta):
    x = 43
    pass

print(MyClass.version)  # 输出: 1.0



# 元类可以修改类的属性, 也可以修改类的方法
# 必须实现 required_method() 方法
class RequiredMeta(type):
    def __new__(cls, name, bases, attrs):
        # 通过 attrs 字典检查类是否实现了 required_method() 方法
        # 如果没有实现，则抛出异常
        if 'required_method' not in attrs:
            raise TypeError(f"{name} 必须实现 required_method()")
        return super().__new__(cls, name, bases, attrs)

# 使用元类创建类，必须实现 required_method() 方法
class Base(metaclass=RequiredMeta):
    # pass
    def required_method(self):
        # pass  # 必须实现，否则报错
        print('required_method')


# 使用元类创建类，必须实现 required_method() 方法
# 继承 Base 类，必须实现 required_method() 方法，即使是父类已经实现了。
class Child(Base):
    # pass
    def required_method(self):
        # pass  # 必须实现，否则报错
        print('required_method')
    #
    #     raise TypeError(f"{name} 必须实现 required_method()")
    # TypeError: Base 必须实现 required_method()

c = Child()